﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCFachadaNegocio;
using SIMCObjetoNegocio;

namespace SIMCPresenter
{
    public interface IConsultarPortafoliosView : IViewBase
    {
        event EventHandler<SearchEventArgs<PortafolioSearchCriteria>> Buscar;
        event EventHandler<SearchEventArgs<PortafolioSearchCriteria>> BuscarBalance;
        event EventHandler<SearchEventArgs<Usuario>> InicializarFiltros;
        event EventHandler<SearchEventArgs<PortafolioSearchCriteria>> Iniciar;

        PagedResult<Portafolio> ListaPortafolio { set; }
        PortafolioBalance BalanceHeader { set; }
        IList<PortafolioBalancePosicion> BalancePosiciones { set; }
        IList<string> TiposPortafolio { set; }

        string NombreUsuario { get; }
        DateTime Fecha { get; }
        bool EsUsuarioInterno { get; }

        bool VisibilidadBalance { get; set; }
        bool VisibilidadBusqueda { set; }
        bool VisibilidadFiltros { set; }
    }

    public class ConsultarPortafoliosPresenter : PresenterBase
    {
        private IConsultarPortafoliosView mView;
        private FachadaPortafolio m_PortafolioFachada;

        public ConsultarPortafoliosPresenter(IConsultarPortafoliosView p_View)
            : base(p_View)
        {
            this.mView = p_View;
            m_PortafolioFachada = new FachadaPortafolio();
            this.Initialize();
        }
        private void Initialize()
        {
            this.mView.Iniciar += new EventHandler<SearchEventArgs<PortafolioSearchCriteria>>(mView_Iniciar);
            this.mView.Buscar += new EventHandler<SearchEventArgs<PortafolioSearchCriteria>>(mView_Buscar);
            this.mView.BuscarBalance += new EventHandler<SearchEventArgs<PortafolioSearchCriteria>>(mView_BuscarBalance);
            this.mView.InicializarFiltros += new EventHandler<SearchEventArgs<Usuario>>(mView_InicializarFiltros);
        }

        void mView_Iniciar(object sender, SearchEventArgs<PortafolioSearchCriteria> e)
        {

            if (mView.EsUsuarioInterno)
            {
                mView.VisibilidadBusqueda = true;
                mView.VisibilidadFiltros = true;
               
               BuscarPortafolios(e.Element);

            }
            else
            {
                PortafolioSearchCriteria Busqueda = new PortafolioSearchCriteria(mView.Fecha)
                {
                    NombreUsuarioExterno = mView.NombreUsuario
                };
                BuscarPortafolios(Busqueda);
            }
        }

        void mView_InicializarFiltros(object sender, SearchEventArgs<Usuario> e)
        {
            IniciarFiltros(e.Element);
        }

        private void IniciarFiltros(Usuario p_Usuario)
        {
            mView.TiposPortafolio = m_PortafolioFachada.BuscarTiposPortafoliosPorUsuario(p_Usuario);
        }
        private void mView_Buscar(object sender, SearchEventArgs<PortafolioSearchCriteria> e)
        {
            try
            {
                if (true)
                {
                    BuscarPortafolios(e.Element);
                    mView.VisibilidadFiltros = false;
                }
                else
                {
                    mView.MostrarMensaje(string.Format("Debe especificar al menos un filtro"), false);
                }
            }
            catch (Exception ex)
            {
                mView.MostrarMensaje(string.Format("Ocurrió un error: {0} en {1}", ex.Message, ex.StackTrace), false);
            }
        }
        private void BuscarPortafolios(PortafolioSearchCriteria p_PSC)
        {
            PagedResult<SIMCObjetoNegocio.Portafolio> portafolios = m_PortafolioFachada.BuscarListaPortafolio(p_PSC, p_PSC.Start, p_PSC.Max);

            if (portafolios != null)
            {
                mView.MostrarMensaje("Se encontraron " + portafolios.Total + " portafolios", true);
                mView.ListaPortafolio = portafolios;
            }
        }
        private void mView_BuscarBalance(object sender, SearchEventArgs<PortafolioSearchCriteria> e)
        {
            try
            {
                int id = e.Element.IdPortafolio.GetValueOrDefault(0);
                PortafolioBalance balance = m_PortafolioFachada.BuscarBalance(id, e.Element.Fecha);
                IList<PortafolioBalancePosicion> Posiciones = m_PortafolioFachada.BuscarPosiciones(id, e.Element.Fecha);

                if (balance != null)
                {
                    mView.VisibilidadBalance = true;
                    mView.BalanceHeader = balance;
                    mView.BalancePosiciones = Posiciones;
                }
                else
                {
                    mView.VisibilidadBalance = false;
                    mView.MostrarMensaje("No se encontró balance en esta fecha", false);
                }
            }
            catch (Exception ex)
            {
                mView.MostrarMensaje(string.Format("Ocurrió un error: {0} en {1}", ex.Message, ex.StackTrace), false);
            }
        }
    }
}
